--- import BaseLayout from "@/layouts/BaseLayout.astro"; import { getDatabase, schema } from "@/db"; import { eq, and } from "drizzle-orm"; import type { NodePgDatabase } from "drizzle-orm/node-postgres"; import { createHash } from "crypto"; const { org: orgName } = Astro.params; const token = Astro.url.searchParams.get("token") || ""; const db = getDatabase() as NodePgDatabase; const organization = await db.query.organizations.findFirst({ where: eq(schema.organizations.name, orgName!), }); let invite = null; if (organization && token) { const tokenHash = createHash("sha256").update(`och-invite:${token}`).digest("hex"); invite = await db.query.orgInvites.findFirst({ where: and( eq(schema.orgInvites.tokenHash, tokenHash), eq(schema.orgInvites.organizationId, organization.id), ), }); } const currentUser = Astro.locals.user; const isExpired = invite ? invite.expiresAt && new Date(invite.expiresAt) < new Date() : false; const isPending = invite?.status === "pending"; ---
{!organization || !invite ? ( <>

Invitation not found

This invitation link is invalid or has already been used.

) : isExpired ? ( <>

Invitation expired

Ask an organization admin to send a new invitation.

) : !isPending ? ( <>

Invitation already handled

This invitation has been {invite.status}.

) : !currentUser ? ( <>

You're invited!

Join {organization.displayName || organization.name} on OpenCodeHub.

Sign in to accept ) : ( <>

You're invited!

Join {organization.displayName || organization.name} as a {invite.role}.

)}